Work-Facts

  • Управление версиями нуггетов сразу во всем решении

Для этого можно внести версию в корневой файл Directory.Packages.props. А внутри проектов писать нуггеты без версий.

<Project>
  <ItemGroup>
    <PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
    <PackageVersion Include="Serilog" Version="2.10.0" />
  </ItemGroup>
</Project>
  • Для того чтобы во время тестирования протестировать интернал класс, можно использовать атрибуты сборки. Один из них:
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("YourTestProjectName")]

IGrouping

Является результатом работы GroupBy, можно итерироваться, хранит ключ группы и список элементов группы

GUID IN DB

GUID и UUID используют алгоритм именно байтовой генерации, а строки которые мы видим, это результат интерпретации байтов в алфавит из 16ти символов 0-9 A-F, а значит на олин символ уходит половина байта

Таким образом ключ состоящий из 32 символов весит 16 байт изначально
Но, если его сохранять в БД как строку то он начнет весить уже как Unicode строка, а значит будет весить как минимум 32 байта.
Таким образом, выгоднее сохранять в бд специальным типом UUID, а не строкой

Single(it => some(it)) vs First(it => some(it))

Single возвращает единственный элемент, а значит кинет исключение если элементов нет или если их больше чем один
First кидает исключение только если элементов нет

InvariantCultureIgnoreCase

Если есть необходимость всравнении строк без регистра и культурных символов, можно применять параметр

someString.Equal(otherString, StringComparison.InvariantCultureIgnoreCase)

Secret.json

В вижле можно нажать правую кнопку мыши на проект и нажать Manage User Secrets и откроется неотслеживаемый гитом файл secrets.json

Очистка конфигов

config.Sources.Clear()

Условие при исключении

Чтобы красиво выбрасывать исключения по условиям, можно воспользоваться такой конструкцией

ArgumentNullException.ThrowIfNull(model)

Nuget Config

В проектах на си шарп, при скачивании нугетов, зеркалами и пакетами можно управлять из общего конфига в AppData или из конфига в корне проекта/решения
Называться он должен Nuget.conf

Порядок полей в классах и структурах

В структурах дотнет меняет порядок полей для оптимизации, а вот в классах оставляет как есть для нормальной работы GC.

Seed пагинация

Это применяется когда нужна пагинация на гигаобъеме данных
в таком случае, даже в пристуствии индекса на поле, для запроса

SELECT * FROM elements ORDER BY created_at LIMIT 100 OFFSET 100_000_000

Будет произведен перебор 100_000_000 элементов

Но дерево работает быстрее на поиск, поэтому можно просить пользователя отдавать не просто номер страницы но и значение последнего элемента и запрос преобразовать в

SELECT * FROM elements WHERE created_at > 'some_value' ORDER BY created_at LIMIT 100 OFFSET 100_000_000

В таком случае мы быстро по дереву найдем нужное значение и просто быстро достанем все следующие.

Глобальные директивы типов

global using System;

После этого, компилятор будет знать что во всем проекте применяется этот путь к типам.